<?php

namespace app\admin\controller;

use app\common\model\file\FileModel;
use app\common\service\FileService;
use think\helper\Str;
use think\response\Json;
use think\facade\Config;
use Exception;
use app\BaseController;
use app\common\service\CosUploadService;
use app\common\service\TencentOssUploader;
use Qcloud\Cos\Client;
class CosUpload extends Controller
{
    /**
     * 重写中间件配置，科普文章列表API不需要认证
     */
    protected array $middleware = ['operLog'];

    /**
     * 初始化
     */
    public function initialize()
    {
        parent::initialize();
        // 检查是否已配置COS
        $this->checkCosConfig();
    }

    /**
     * 检查COS配置是否完整
     * @throws Exception
     */
    protected function checkCosConfig()
    {
        $config = Config::get('admin', []);
        if (empty($config['cos_secret_id']) ||
            empty($config['cos_secret_key']) ||
            empty($config['cos_bucket'])) {
            throw new Exception('腾讯云COS配置不完整，请先在后台配置COS信息');
        }
    }

    /**
     * 简单文件上传
     * @return Json
     */
    public function simpleUpload()
    {
        // 获取上传的文件

        $groupId = request()->post('group_id',0);
        if (!$_FILES['file']) {
            return error('请选择要上传的文件');
        }
        $file = $_FILES['file'];
        try {
            // 2. 实例化上传类
            $ossUploader = new TencentOssUploader();
            $uploads = 'uploads/';
            $saveDir = $uploads  . date('Ymd');
            // 3. 上传表单文件
            if ($_SERVER['REQUEST_METHOD'] === 'POST') {

                $result = $ossUploader->uploadHttpFile($file, $uploads);

                if ($result['success']) {
                    $ossFile = $result['data']['ossFile'];
                    $type = explode('/', $file['type']);
                    $data = [
                        'admin_id' => 0,
                        'group_id' => $groupId,
                        'storage_path' => $saveDir,
                        'url' => Config::get('admin.cos_domain') . $result['data']['url'],
                        'hash' => Str::random(32),
                        'origin_name' => $file['name'],
                        'object_name' => $ossFile['fileName'],
                        'mimetype' => $file['type'],
                        'extension' => $type[1],
                        'media_type' => $type[0],
                        'filesize' => $file['size']
                    ];
                    // 4、写入数据库中
                    $file = FileModel::create($data);
                    return success('上传成功', $data);
                } else {
                    return error($result['message']);

                }
            }


        } catch (Exception $e) {
            return error($e->getMessage());
        }

    }

    /**
     * 分片上传大文件
     * @return Json
     */
    public function sliceUpload(): Json
    {

        // 获取上传的文件

        $groupId = request()->post('group_id',0);
        if (!$_FILES['file']) {
            return error('请选择要上传的文件');
        }
        $file = $_FILES['file'];
        try {
            // 2. 实例化上传类
            $ossUploader = new TencentOssUploader();

            // 3. 上传表单文件
            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
                // 生成存储路径
                $uploads = 'uploads/';
                $saveDir = $uploads  . date('Ymd');

                $ossFilePath = $ossUploader->generateOssPath($file['name'],'uploads/');
                $result = $ossUploader->uploadLargeFile($file['tmp_name'], $ossFilePath['path']);

                trace('分片上传大文件'.date("Y-m-d H:i:s").json_encode($result,256));
                if ($result['success']) {

//                    $ossFile = $result['data']['ossFile'];
                    $type = explode('/', $file['type']);
                    $data = [
                        'admin_id' => 0,
                        'group_id' => $groupId,
                        'storage_path' => $saveDir,
                        'url' => Config::get('admin.cos_domain') . $result['data']['url'],
                        'hash' => Str::random(32),
                        'origin_name' => $file['name'],
                        'object_name' => $ossFilePath['fileName'],
                        'mimetype' => $file['type'],
                        'extension' => $type[1],
                        'media_type' => $type[0],
                        'filesize' => $file['size']
                    ];
                    // 4、写入数据库中
                    $file = FileModel::create($data);


                    return success('上传成功', $data);
                } else {
                    return error($result['message']);

                }
            }

            // 4. 上传本地文件示例
            // $localFile = '/path/to/local/file.jpg';
            // $ossPath = 'files/image.jpg';
            // $result = $ossUploader->uploadFile($localFile, $ossPath);

            // 5. 上传大文件示例(分片上传)
            // $largeFile = '/path/to/large/file.zip';
            // $ossPath = 'files/large.zip';
            // $result = $ossUploader->uploadLargeFile($largeFile, $ossPath);

        } catch (Exception $e) {
            return error($e->getMessage());
        }
//        try {
//            // 获取上传的文件
//            $file = request()->file('file');
//            if (!$file) {
//                return error('请选择要上传的文件');
//            }

        // 获取文件信息
//            $filePath = $file->getRealPath();
//            $fileInfo = [
//                'name' => $file->getOriginalName(),
//                'size' => $file->getSize(),
//                'type' => $file->getType(),
//                'extension' => $file->getExtension()
//            ];
//
//            // 初始化COS服务（可配置更大的分片大小）
//            $cosService = new CosUploadService([
//                'chunk_size' => 10485760, // 10MB分片
//                'max_thread' => 5 // 最大并发数
//            ]);
//
//            // 执行分片上传
//            $result = $cosService->uploadSlice($filePath, $fileInfo['name']);
//
//            return success('上传成功', [
//                'url' => $result['url'],
//                'key' => $result['key']
//            ]);
//        } catch (Exception $e) {
//            return error($e->getMessage());
//        }
    }

    /**
     * 自动选择上传方式
     * @return Json
     */
    public function autoUpload(): Json
    {
        try {
            // 获取上传的文件
            $file = request()->file('file');
            if (!$file) {
                return error('请选择要上传的文件');
            }

            // 获取文件信息
            $filePath = $file->getRealPath();
            $fileInfo = [
                'name' => $file->getOriginalName(),
                'size' => $file->getSize(),
                'type' => $file->getType(),
                'extension' => $file->getExtension()
            ];

            // 初始化COS服务
            $cosService = new CosUploadService();

            // 自定义分片上传阈值（15MB）
            $threshold = 15728640;

            // 自动选择上传方式
            $result = $cosService->autoUpload($filePath, $fileInfo['name'], $threshold);

            // 是否保存到数据库
            $saveToDb = request()->param('save_db', 1, 'intval');
            $groupId = request()->param('group_id', 0, 'intval');

            $returnData = [
                'url' => $result['url'],
                'key' => $result['key']
            ];

            // 保存到数据库
            if ($saveToDb) {
                $dbInfo = [
                    'name' => $fileInfo['name'],
                    'path' => $filePath,
                    'type' => $this->getFileMediaType($fileInfo['type']),
                    'mime' => $fileInfo['type'],
                    'size' => $fileInfo['size']
                ];

                $dbResult = $cosService->saveToDatabase($result, $dbInfo, $groupId);
                $returnData['file_id'] = $dbResult['id'];
                $returnData['db_info'] = $dbResult;
            }

            return success('上传成功', $returnData);
        } catch (Exception $e) {
            return error($e->getMessage());
        }
    }

    /**
     * 删除文件
     * @return Json
     */
    public function delete(): Json
    {
        try {
            $key = request()->param('key', '');
            if (empty($key)) {
                return error('缺少文件key参数');
            }

            // 初始化COS服务
            $cosService = new CosUploadService();

            // 执行删除
            $cosService->delete($key);

            return success('删除成功');
        } catch (Exception $e) {
            return error($e->getMessage());
        }
    }

    /**
     * 获取文件信息
     * @return Json
     */
    public function getInfo(): Json
    {
        try {
            $key = request()->param('key', '');
            if (empty($key)) {
                return error('缺少文件key参数');
            }

            // 初始化COS服务
            $cosService = new CosUploadService();

            // 获取文件信息（通过生成预签名URL来验证文件是否存在）
            $presignedUrl = $cosService->getPresignedUrl($key);

            // 构建文件信息返回
            $info = [
                'key' => $key,
                'url' => $presignedUrl,
                'exists' => true
            ];

            return success('获取成功', $info);
        } catch (Exception $e) {
            return error($e->getMessage());
        }
    }

    /**
     * 根据MIME类型判断媒体类型
     * @param string $mimeType
     * @return string
     */
    protected function getFileMediaType($mimeType)
    {
        if (strpos($mimeType, 'image/') === 0) {
            return 'image';
        } elseif (strpos($mimeType, 'video/') === 0) {
            return 'video';
        } elseif (strpos($mimeType, 'audio/') === 0) {
            return 'audio';
        }
        return 'file';
    }

    /**
     * 测试COS连接
     * @return Json
     */
    public function testConnection(): Json
    {
        try {
            // 初始化COS服务
            $cosService = new CosUploadService();

            // 使用服务类提供的测试方法
            $cosService->testConnection();

            return success('COS连接成功');
        } catch (Exception $e) {
            return error('COS连接失败: ' . $e->getMessage());
        }
    }

    /**
     * 配置信息页面
     * @return mixed
     */
    public function config()
    {
        if (request()->isAjax()) {
            // 获取配置
            $config = Config::get('admin', []);
            return success('获取成功', [
                'cos_region' => $config['cos_region'] ?? '',
                'cos_bucket' => $config['cos_bucket'] ?? '',
//                'cos_cdn_domain' => $config['cos_cdn_domain'] ?? '',
                // 注意：不要返回secret_id和secret_key
            ]);
        }

        // 渲染页面
        return view('cos_upload/config');
    }
}